package com.test.thread.forkjoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

/**
 * Created by jl on 2018/8/31 0031
 * fork join框架采用分治法将任务分解从而提高整体任务执行效率
 * forkJoinTask.fork()方法用于将任务继续拆分或执行，如果是拆分，当前线程就充当了监工无法被分配到任务
 * forkJoinTask.invokeAll(task1,task2,...)方法是针对fork方法的优化，被invoke的n个任务中会将第一个任务留给当前线程
 * 去执行，这样递归循环下去从而保证所有的线程都充当工人角色（有些线程既是工人也是监工，没有只是监工的线程）
 * forkJoinTask.join()方法用于返回任务执行的结果
 */
public class Demo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(Thread.currentThread().getName());

        ForkJoinPool forkJoinPool = new ForkJoinPool(5);
        CountTask task = new CountTask(1, 6);

        Future<Integer> result = forkJoinPool.submit(task);
        System.out.println(result.get());
    }
}
